#!/usr/bin/env python
# ._*_.conding:utf-8._*_

from ihome.utils.captcha.captcha import captcha
from ihome.libs.yuntongxun.sms import CCP
from flask import request,abort,make_response,jsonify,json
from ihome import redis_store,constants,db
import logging
import re
import random
from flask import current_app,g,session
from ihome.models import User
from ihome.utils.common import get_user_info
from ihome.utils.response_code import RET
from . import register_login_bp


@register_login_bp.route("/imagecode")
def get_img_code():
    """
    1.获取参数
    2.验证参数
    3.访问接口获取图片资源，并保存在redis中
    :return:
    """
    cur_imagecode = request.args.get("cur")
    pre_imagecode = request.args.get("pre")
    if not cur_imagecode:
        return abort(404)
    image_name, real_image_code, image_data = captcha.generate_captcha()
    try:
        redis_store.delete("image_code_%s" %pre_imagecode)
        redis_store.setex("image_code_%s" % cur_imagecode, constants.IMAGE_CODE_REDIS_EXPIRES, real_image_code)
    except Exception as e:
        logging.error(e)
        return make_response(jsonify(errno=RET.DATAERR,errmsg="Redis数据库保存图片失败"))
    else:
        res = make_response(image_data)
        res.headers["Content"] = "png/image"
        return res


@register_login_bp.route("/smscode",methods=["POST"])
def send_sms_code():
    data = request.data
    data_dict = json.loads(data)
    mobile = data_dict.get("mobile")
    image_code = data_dict.get("image_code")
    image_code_id = data_dict.get("image_code_id")
    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR,errmsg="短信验证参数错误")
    if not re.match(r"^1[34589][0-9]{9}$",mobile):
        return jsonify(errno=RET.PARAMERR,errmsg="手机号码错误")
    try:
        real_image_code = redis_store.get("image_code_%s" %image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="图片验证码过期")
    else:
        redis_store.delete("image_code_%s" %image_code)
    if image_code.lower() != real_image_code.lower():
        return make_response(jsonify(errno=RET.DATAERR,errmsg="图片验证码错误"))
    msg = "%06d" %random.randint(1,1000000)
    try:
        result = CCP().send_template_sms(mobile, [msg, constants.SMS_CODE_REDIS_EXPIRES / 60], 1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg="发送短信验证码失败")
    try:
        redis_store.setex(mobile,constants.SMS_CODE_REDIS_EXPIRES,msg)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR,errmsg="短信验证码保存错误")
    return jsonify(errno=RET.OK,errmsg="发送短信验证码成功")

#注册接口实现
@register_login_bp.route("/user",methods = ["POST"])
def registered():
    """
    1.POST请求,ajax方式获取数据,
    :return:
    """
    #2.1获取参数 1.手机号 2.短信验证码 3.密码
    mobile = request.json.get("mobile")
    phonecode = request.json.get("phonecode")
    password = request.json.get("password")
    #2.2进行非空判断
    if not all([mobile, phonecode, password]):
        return jsonify(errno=RET.PARAMERR,errmsg="参数不足")
    #2.3手机号码进行正则判断
    # if not re.match(r"1[35678]\d{9}",mobile):
    #     return jsonify(errno=RET.PARAMERR,errmsg="手机号码不合法")
    #3.逻辑分析和数据库查询的操作
    #3.1手机号码数据库查询,查询出对象,如果有就返回已经注册,如果没有才走到下一步
    try:
        user = User.query.filter(User.mobile == mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询手机号码异常")
    if user:
        return jsonify(errno=RET.DATAEXIST,errmsg="手机号码已经注册")
    #3.2通过手机号码在redis中查询到保存的验证码,
    try:
        phonecode_redis = redis_store.get(mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询短信验证码错误")
    #如果没有,表示已经验证码已经过期了
    if not phonecode_redis:
        return jsonify(errno=RET.NODATA, errmsg="短信验证码过期")
    #如果有, 则删除验证码, 用变量保存验证码
    redis_store.delete(mobile)
    #3.3获取的短信验证码和查询到的验证码进行对比
    if phonecode != phonecode_redis:
        return jsonify(errno=RET.DATAERR,errmsg="短信验证码错误")
    #3.4创建用户对象,保存到mysql数据库中,默认手机号码为昵称
    user = User()
    user.name = mobile
    user.password=password
    #用户昵称和电话均为mobile
    user.mobile = mobile
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.PARAMERR, errmsg="保存用户信息错误")
    #并将用户信息保存到session中,保存相关登陆信息,用户昵称,用户手机号码,用户id等
    session["mobile"]=user.mobile
    session["user_name"]=user.name
    session["user_id"] = user.id
    #4.返回ok数据
    return jsonify(errno=RET.OK, errmsg="注册成功")


#登陆接口和获取登陆接口实现
@register_login_bp.route("/session",methods = ["GET","POST"])
@get_user_info
def login():
    """
    0.GET方式,查询session中是否有值,直接返回数据,有值和没有值返回不同的参数代码
        1.通过session中保存的user_id值查询id值
        2.通过这个user_id去查询对象
        3.判断对象是否存在,如果有,换回相关数据,如果没有返回相关数据
    1.post方式,通过ajax传递参数
    :return:
    """

    #2.获取参数;获取登陆手机号码和用户登陆密码
    if request.method == "GET":
        #查询session中是否有值
        user = g.user
        if not user:
            return jsonify(errno=RET.SESSIONERR,errmsg="未登录")
        data={
            "name":user.name,
            "user_id":user.id
        }


        return jsonify(errno=RET.OK,errmsg="ok",data=data)


    mobile = request.json.get("mobile")
    password = request.json.get("password")
    #3.校验参数  3.0进行非空判断
    if not all([mobile,password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不足")
    #3.1手机号码校验
    # if not re.match(r"1[35678]\d{9}",mobile):
    #     return jsonify(errno=RET.PARAMERR,errmsg="手机号码不合法")
    #4.业务逻辑分析和数据库相关操作
    #4.1通过手机号码在mysql中查询用户信息,
    try:
        user = User.query.filter(User.mobile==mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询手机号码异常")
    #4.1.1如果没有值,返回请先注册
    if not user:
        return jsonify(errno=RET.USERERR,errmsg="手机未注册")
    #4.2如果在mysql中有值;
    #4.2.1查询到的对象调用check_passowrd方法,参数是获取的用户登陆密码
    if not user.check_passowrd(password):
        return jsonify(errno=RET.PWDERR,errmsg="密码错误")
    #如果密码正确,返回登陆成功信息
    session["mobile"] = user.mobile
    session["user_name"] = user.name
    session["user_id"] = user.id
    return jsonify(errno=RET.OK,errmsg="登陆成功")
#提交


@register_login_bp.route("/login_out", methods=["DELETE"])
@get_user_info
def login_out():
    """退出登录 后端接口"""

    session.pop("mobile")
    session.pop("user_name")
    session.pop("user_id")

    return jsonify(errno=RET.OK, errmsg="退出登录成功")

